﻿(function($) {
	$.fn.countDown = function(options) {
		config = {};
		$.extend(config, options);
		diffSecs = this.setCountDown1(config);
		if(config.onComplete) {
			$.data($(this)[0], 'callback', config.onComplete);
		}
		if(config.omitWeeks) {
			$.data($(this)[0], 'omitWeeks', config.omitWeeks);
		}
		$('#' + $(this).attr('id') + ' .digit').html('<div class="top"></div><div class="bottom"></div>');
		$(this).doCountDown1($(this).attr('id'), diffSecs, 500);
		return this;
	};
	$.fn.stopCountDown = function() {
		clearTimeout($.data(this[0], 'timer'));
	};
	$.fn.startCountDown = function() {
		this.doCountDown1($(this).attr('id'), $.data(this[0], 'diffSecs'), 500);
	};
	$.fn.setCountDown1 = function(options) {
		var targetTime = new Date();
		if(options.targetDate) {
			targetTime = new Date(options.targetDate.month + '/' + options.targetDate.day + '/' + options.targetDate.year + ' ' + options.targetDate.hour + ':' + options.targetDate.min + ':' + options.targetDate.sec + (options.targetDate.utc ? ' UTC' : ''));
		} else if(options.targetOffset) {
			targetTime.setFullYear(options.targetOffset.year + targetTime.getFullYear());
			targetTime.setMonth(options.targetOffset.month + targetTime.getMonth());
			targetTime.setDate(options.targetOffset.day + targetTime.getDate());
			targetTime.setHours(options.targetOffset.hour + targetTime.getHours());
			targetTime.setMinutes(options.targetOffset.min + targetTime.getMinutes());
			targetTime.setSeconds(options.targetOffset.sec + targetTime.getSeconds());
		}
		var nowTime = new Date();
		diffSecs = Math.floor((targetTime.valueOf() - nowTime.valueOf()) / 1000);
		$.data(this[0], 'diffSecs', diffSecs);
		return diffSecs;
	};
	$.fn.doCountDown1 = function(id, diffSecs, duration) {
		$this = $('#' + id);
		if(diffSecs <= 0) {
			diffSecs = 0;
			if($.data($this[0], 'timer')) {
				clearTimeout($.data($this[0], 'timer'));
			}
		}
		var secs = diffSecs % 60;
		var mins = Math.floor(diffSecs / 60) % 60;
		var hours = Math.floor(diffSecs / 60 / 60) % 24;
		var days = Math.floor(diffSecs / 60 / 60 / 24);
		$this.dashChangeTo(id, 'seconds_dash', secs, duration ? duration : 800);
		$this.dashChangeTo(id, 'minutes_dash', mins, duration ? duration : 1200);
		$this.dashChangeTo(id, 'hours_dash', hours, duration ? duration : 1200);
		$this.dashChangeTo(id, 'days_dash', days, duration ? duration : 1200);
		$.data($this[0], 'diffSecs', diffSecs);
		if(diffSecs > 0) {
			var e = $this;
			t = setTimeout(function() { e.doCountDown1(id, diffSecs - 1) }, 1000);
			$.data(e[0], 'timer', t);
		} else if(cb = $.data($this[0], 'callback')) {
			$.data($this[0], 'callback')();
		}

	};
	$.fn.dashChangeTo = function(id, dash, n, duration) {
		$this = $('#' + id);
		for(var i = ($this.find('.' + dash + ' .digit').length - 1); i >= 0; i--) {
			var d = n % 10;
			n = (n - d) / 10;
			$this.digitChangeTo('#' + $this.attr('id') + ' .' + dash + ' .digit:eq(' + i + ')', d, duration);
		}
	};
	$.fn.digitChangeTo = function(digit, n, duration) {
		if(!duration) {
			duration = 800;
		}
		if($(digit + ' div.top').html() != n + '') {

			$(digit + ' div.top').css({ 'display': 'none' });
			$(digit + ' div.top').html((n ? n : '0')).slideDown(duration);

			$(digit + ' div.bottom').animate({ 'height': '' }, duration, function() {
				$(digit + ' div.bottom').html($(digit + ' div.top').html());
				$(digit + ' div.bottom').css({ 'display': 'inline-block', 'height': '' });
				$(digit + ' div.top').hide().slideUp(0);

			});
		}
	};
})(jQuery)